#include<bits/stdc++.h>
using namespace std;
const int MAXN=50000,INF=1000000000;
int n,cnt,ans,root,t1,t2;
struct treap
{
	int lc,rc,key,pri;
}a[MAXN];
void lturn(int &o)
{
	int t=a[o].rc;
	a[o].rc=a[t].lc;
	a[t].lc=o;
	o=t;
	return;
}
void rturn(int &o)
{
	int t=a[o].lc;
	a[o].lc=a[t].rc;
	a[t].rc=o;
	o=t;
	return;
}
void insert(int &o,int k)
{
	if(!o)
	{
		o=++cnt;
		a[o]=(treap){0,0,k,rand()};
		return;
	}
	if(k<a[o].key)
	{
		insert(a[o].lc,k);
		if(a[o].pri<a[a[o].lc].pri)rturn(o);
	}
	else if(k>a[o].key)
	{
		insert(a[o].rc,k);
		if(a[o].pri<a[a[o].rc].pri)lturn(o);
	}
	return;
}
void query_pro(int o,int k)
{
	if(!o)return;
	if(k<a[o].key)query_pro(a[o].lc,k);
	else
	{
		t1=a[o].key;
		query_pro(a[o].rc,k);
	}
	return;
}
void query_sub(int o,int k)
{
	if(!o)return;
	if(k>a[o].key)query_sub(a[o].rc,k);
	else
	{
		t2=a[o].key;
		query_sub(a[o].lc,k);
	}
	return;
}
int main()
{
	scanf("%d",&n);
	srand(n);
	int x;
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&x);
		if(i==1)ans=x;
		else
		{
			t1=-INF;t2=INF;
			query_pro(root,x);
			query_sub(root,x);
			ans+=min(x-t1,t2-x);
		}
		insert(root,x);
	}
	printf("%d\n",ans);
	return 0;
}
